package com.zr.kufangkuwei.service.impl;

import com.zr.kufangkuwei.pojo.*;
import com.zr.kufangkuwei.mapper.KuFangMapper;
import com.zr.kufangkuwei.service.KuFangService;
import com.zr.meiju.StatusEnum;
import com.zr.util.AllRecords;
import com.zr.util.ResultBuildVo;
import com.zr.util.ResultVo;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.Valid;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * Created by Administrator on 2019/7/16.
 */
@Service
public class KuFangServiceImpl implements KuFangService {

    @Autowired
    private KuFangMapper kuFangMapper;

    /**
     * 查询
     * @param depotareaSelectVo
     * @return
     */
    @Override
    public ResultVo<AllRecords> queryPage(DepotareaSelectVo depotareaSelectVo) {
        //查询数据
        List<Depotarea> depotareaList = kuFangMapper.queryPage(depotareaSelectVo);
        //查询数量
        int count = kuFangMapper.queryCount(depotareaSelectVo);
        //把当前页,每一页的大小,总页数,总条数,放入到AllRecords
        AllRecords allRecords = new AllRecords();
        allRecords.setPageIndex(depotareaSelectVo.getPageIndex());
        allRecords.setPageSize(depotareaSelectVo.getPageSize());
        allRecords.setTotalNumber(count);
        allRecords.resetTotalNumber(count);
        allRecords.setDataList(depotareaList);
        return ResultBuildVo.success(allRecords);
    }

    /**
     * 修改
     * @param depotpositionUpdate
     * @return
     */
    @Override
    public ResultVo update(@Valid DepotpositionUpdate depotpositionUpdate) {
        //逻辑验证=禁用状态下才允许修改
//        ResultVo assigment = assigmentUpdate(depotpositionUpdate);
//        if (!assigment.isSuccess()){
//            return assigment;
//        }
        //给数据库中的创建时间和修改时间等信息赋值
        Depotposition depotposition = new Depotposition();
        Date nowDate = new Date();
        depotposition.setUpdateTime(nowDate);
        depotposition.setUpdateName("小明");
        //把左边对象的数据赋值给右边对象的数据
        //注意必须相同参数名称和相同参数类型才能自动进行赋值
        BeanUtils.copyProperties(depotpositionUpdate, depotposition);
        kuFangMapper.update(depotposition);
        return ResultBuildVo.success(depotpositionUpdate);
    }

    /**
     * 添加
     * @param depotareaAddVo
     * @return
     */
    @Override
    public ResultVo add(@Valid DepotareaAddVo depotareaAddVo) {

        List<Depot> depotList = depotareaAddVo.getDepotList();
        List<Depotarea> depotareaList = depotareaAddVo.getDepotareaList();
        // 7.入库
        kuFangMapper.addDepotarea(depotareaAddVo);//添加库房名称和编码
        kuFangMapper.addDepotList(depotList);//添加库区
        kuFangMapper.addDepotareaList(depotareaList);//添加厂商明细
        return ResultBuildVo.success(depotareaAddVo);
    }

    /**
     * 库房下拉框
     * @param id
     * @return
     */
    @Override
    public ResultVo<List<Depot>> queryDepot(Integer id) {
        List<Depot> depotList = kuFangMapper.queryDepot(id);
        return ResultBuildVo.success(depotList);
    }

    /**
     * 库区下拉框
     * @param id
     * @return
     */
    @Override
    public ResultVo<List<Depotarea>> queryDepotarea(Integer id) {
        List<Depotarea> depotareaList = kuFangMapper.queryDepotarea(id);
        return ResultBuildVo.success(depotareaList);
    }

    /**
     * 导入
     * @param file
     * @return
     * @throws Exception
     */
    @Override
    public ResultVo importPlanClass(MultipartFile file) throws Exception {
        if (file==null){
            return ResultBuildVo.error("导入信息不存在","500");
        }
        if (!file.getOriginalFilename().contains("xlsx")){
            return ResultBuildVo.error("只能导入2007版excel文件！","500");
        }
        /*模板是否是需要导入的模板，验证模板是否正确.导入数据到list集合中
        */
        ResultVo<List<DepotareaAddVo>> listResultVo = importData(file);
        if (!listResultVo.isSuccess()){
            return listResultVo;
        }
      /*  4.格式问题，必须保持统一格式，统一为字符串格式导入 5.验证不为空字段是否为空6.验证字符长度是否符合需求*/
//        ResultVo validate = validate(listResultVo.getData());
//        if (!validate.isSuccess()){
//            return validate;
//        }
      /*  7.验证数据是否存在也就是是否合法 8.验证数据是否重复9.对于需要转换的数据进行数据转换，比如数据库存的数据为数字格式，用户输入的为汉字，需要把汉字转换为数字存储*//**/
        ResultVo resultVo = validate2(listResultVo.getData());
        if (!resultVo.isSuccess()){
            return resultVo;
        }
        //入库操作
//        ResultVo resultVo1 = add(listResultVo.getData());
//        if (!resultVo1.isSuccess()){
//            return resultVo1;
//        }
        return listResultVo;
    }

    public ResultVo validate2(List<DepotareaAddVo> depotareaAddVoList){
        /*  7.验证数据是否存在也就是是否合法 8.验证数据是否重复9.对于需要转换的数据进行数据转换，比如数据库存的数据为数字格式，用户输入的为汉字，需要把汉字转换为数字存储*//**/
        /*Set<String> codeSet = new HashSet<>();
        for (PlanClassImportVo planClassImportVo:planClassImportVoList){
            codeSet.add(planClassImportVo.getCode());
        }
        if (codeSet.size()!=planClassImportVoList.size()){
            return ResultBuildVo.error("存在重复的编码信息！","500");
        }*/

        List<String> codeList = new ArrayList<>();
        for (DepotareaAddVo depotareaAddVo:depotareaAddVoList){
            codeList.add(depotareaAddVo.getDepotCode());
        }
        List<String> newList = new ArrayList<>();
        List<String> repeatList = new ArrayList<>();
        for (String code :codeList){
            if (newList.contains(code)){
                repeatList.add(code);
            }else{
                newList.add(code);
            }
        }
        if (repeatList.size()>0){
            return ResultBuildVo.error("存在重复的编码信息！重复的编码信息为："+repeatList,"500");
        }
//        //验证用户输入的是否是启用禁用
//        for (DepotareaAddVo depotareaAddVo:depotareaAddVoList){
//
//            System.out.println(depotareaAddVo.getStatusName());
//            System.out.println(StatusEnum.getValue(depotareaAddVo.getStatusName()));
//            if (StatusEnum.getValue(depotareaAddVo.getStatusName())==null){
//                return ResultBuildVo.error("状态只能是启用或者禁用"+repeatList,"500");
//            }else {
//                depotareaAddVo.setStatus(StatusEnum.getValue(depotareaAddVo.getStatusName())==1?true:false);
//            }
//        }
        return ResultBuildVo.success(depotareaAddVoList);
    }

//    public ResultVo validate(List<DepotareaAddVo> depotareaAddVoList){
        /*
        5.验证不为空字段是否为空
        6.验证字符长度是否符合需求*/
//        for (DepotareaAddVo depotareaAddVo:depotareaAddVoList){
//            if (StringUtils.isEmpty(depotareaAddVo.getCode())){
//                return ResultBuildVo.error("编码不能为空！","500");
//            }else {
//                if (depotareaAddVo.getCode().length()>20){
//                    return ResultBuildVo.error("编码长度不能大于20个字节！","500");
//                }
//            }
//            if (StringUtils.isEmpty(depotareaAddVo.getName())){
//                return ResultBuildVo.error("名称不能为空！","500");
//            }else {
//                if (depotareaAddVo.getName().length()>20){
//                    return ResultBuildVo.error("名称长度不能大于20个字节！","500");
//                }
//            }
//            if (StringUtils.isEmpty(depotareaAddVo.getStatusName())){
//                return ResultBuildVo.error("状态不能为空！","500");
//            }else {
//                if (depotareaAddVo.getStatusName().length()>20){
//                    return ResultBuildVo.error("状态长度不能大于20个字节！","500");
//                }
//            }
//            if (!StringUtils.isEmpty(depotareaAddVo.getRemark())){
//                if (depotareaAddVo.getRemark().length()>50){
//                    return ResultBuildVo.error("描述长度不能大于50个字节！","500");
//                }
//            }
//        }
//        return ResultBuildVo.success(depotareaAddVoList);
//    }


    public  ResultVo<List<DepotareaAddVo>> importData(MultipartFile file)throws Exception{
        //poi核心类，用来读取excel表格中的数据
        XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream());
        //获取单元格中的信息 at0是获取sheet1中的数据。
        XSSFSheet sheet = workbook.getSheetAt(0);
        System.out.println(sheet.getRow(sheet.getFirstRowNum()).getCell(0));
        //验证第一列第一行的表格标头信息是否为 “询价单导入”，如果不是，提示模板错误。
        if (!String.valueOf(sheet.getRow(sheet.getFirstRowNum()).getCell(0)).equals("计划大类模板")) {
            return ResultBuildVo.error("模板错误，请检查模板！","500");
        }
        List<DepotareaAddVo> depotareaAddVos = new ArrayList<>();
        //遍历excel表格中的所有数据，从第五行开始读取，没有数据时终止遍历。
        for (int i = sheet.getFirstRowNum() + 4; i <= sheet.getLastRowNum(); i++) {
            //读取每一行的数据
            XSSFRow xssfRow = sheet.getRow(i);
            if(xssfRow!=null) {
                //验证第一列数据、第二列、第三列数据是否为空
                System.out.println(String.valueOf(xssfRow.getCell(0)).trim());
                System.out.println(String.valueOf(xssfRow.getCell(1)).trim());
                System.out.println(String.valueOf(xssfRow.getCell(2)).trim());
                if ((!StringUtils.isEmpty(String.valueOf(xssfRow.getCell(1)).trim()))||
                        (!StringUtils.isEmpty(String.valueOf(xssfRow.getCell(2)).trim())) ||
                        (!StringUtils.isEmpty(String.valueOf(xssfRow.getCell(3)).trim()))
                        ) {
                    //把每一行的数据放入到实体类中
                 //   DepotareaAddVo depotareaAddVo = build(xssfRow);
                    //把实体类中的数据放入到list集合中
                    ///depotareaAddVos.add(depotareaAddVo);
                }
            }
        }

        return ResultBuildVo.success(depotareaAddVos);
    }
//    private DepotareaAddVo build(XSSFRow xssfRow) throws Exception {
//        DepotareaAddVo addVO = new DepotareaAddVo();
//        addVO.setCode(String.valueOf(xssfRow.getCell(1)).trim());
//        addVO.setName(String.valueOf(xssfRow.getCell(2)).trim());
//        addVO.setStatusName(String.valueOf(xssfRow.getCell(3)).trim());
//        addVO.setRemark(String.valueOf(xssfRow.getCell(4)).trim());
//        return addVO;
//    }


}
